home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Commodities / Ascsend / MUI / Source / mui_ascs_rec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-27  |  10.1 KB  |  353 lines

  1. #include "mui_ascs.h"
  2.  
  3. #define Q_MASK (IEQUALIFIER_CONTROL | IEQUALIFIER_LALT | \
  4.                 IEQUALIFIER_RALT   | IEQUALIFIER_LCOMMAND | IEQUALIFIER_RCOMMAND | \
  5.                 IEQUALIFIER_NUMERICPAD | IEQUALIFIER_RBUTTON | IEQUALIFIER_MIDBUTTON | \
  6.                 IEQUALIFIER_LEFTBUTTON )
  7.  
  8. #define Q_MASK_2 (IECODE_LBUTTON | IECODE_RBUTTON | IECODE_MBUTTON)
  9.  
  10. #define CA_MASK  (IEQUALIFIER_CONTROL | IEQUALIFIER_LSHIFT)
  11. #define CA_MASK2 (IEQUALIFIER_CONTROL | IEQUALIFIER_RSHIFT)
  12.  
  13.  
  14. struct Interrupt *IHandler;
  15. struct IOStdReq  *HandlerIO;
  16. struct MsgPort   *InputPort,*StopPort;
  17. BYTE              device;
  18. struct InputEvent record_anchor;
  19. struct InputEvent *record;
  20. struct Task       *ourtask;
  21. LONG               SigBit;
  22. BOOL               break_on;
  23.  
  24. static void  free_recordline(void);
  25. static ULONG make_control(struct InputEvent *ie,UBYTE *buffer,UBYTE *t);
  26.  
  27. ULONG numev;
  28.  
  29. void rec_start_f(ULONG n)
  30. {
  31.  ULONG max_on;
  32.  get(rec_max_on,MUIA_Selected,&max_on);
  33.  if(!recording)
  34.  {
  35.   recording = TRUE;
  36.   numev = n;
  37.   if(n && (max_on || from_main))break_on = TRUE;
  38.   else break_on = FALSE;
  39.   HandlerIO->io_Data = (APTR)IHandler;
  40.   HandlerIO->io_Command = IND_ADDHANDLER;
  41.   BeginIO((struct IORequest *)HandlerIO);
  42.   record_anchor.ie_NextEvent = NULL;
  43.   record = &record_anchor;
  44.  }
  45. }
  46.  
  47. void rec_stop_f(UBYTE *name)
  48. {
  49.  UBYTE *filename;
  50.  if(!name)get(rec_file,MUIA_String_Contents,&filename);
  51.  else filename = name;
  52.  if(recording)
  53.  {
  54.   AbortIO((struct IORequest *)HandlerIO);
  55.   WaitIO((struct IORequest  *)HandlerIO);
  56.   HandlerIO->io_Data = (APTR)IHandler;
  57.   HandlerIO->io_Command = IND_REMHANDLER;
  58.   DoIO((struct IORequest *)HandlerIO);
  59.   recording = FALSE;
  60.   write_file(filename);  
  61.   free_recordline();
  62.  }
  63. }
  64.  
  65. LONG init_recorder()
  66. {
  67.  LONG n;
  68.  get(rec_handler_pri,MUIA_String_Integer,&n);
  69.  if(InputPort = CreateMsgPort())
  70.  {
  71.   SigBit =  AllocSignal(-1);
  72.   if(SigBit != -1 )
  73.   {
  74.    ourtask = FindTask(0);
  75.    if(IHandler = AllocVec(sizeof(struct Interrupt),MEMF_PUBLIC | MEMF_CLEAR))
  76.    {
  77.     if(HandlerIO = (struct IOStdReq *)CreateExtIO(InputPort,sizeof(struct IOStdReq)))
  78.     {
  79.      if(!(device = OpenDevice("input.device",NULL,(struct IORequest *)HandlerIO,0L)))
  80.      {
  81.       IHandler->is_Code = input_handler;
  82.       /*IHandler->is_Data = mem_pool;*/
  83.       IHandler->is_Node.ln_Pri  = (BYTE)n;
  84.       IHandler->is_Node.ln_Name = "ascsend.input";
  85.       return(TRUE);
  86.      }
  87.     }
  88.    }
  89.   }  
  90.  }
  91.  return (FALSE);
  92. }
  93.  
  94. void exit_recorder()
  95. {
  96.  if(recording)
  97.  {
  98.   AbortIO((struct IORequest *)HandlerIO);
  99.   WaitIO((struct IORequest  *)HandlerIO);
  100.   HandlerIO->io_Data = (APTR)IHandler;
  101.   HandlerIO->io_Command = IND_REMHANDLER;
  102.   DoIO((struct IORequest *)HandlerIO);
  103.  }
  104.  if(HandlerIO)
  105.  {
  106.   if(!device)CloseDevice((struct IORequest *)HandlerIO);
  107.   DeleteExtIO((struct IORequest *)HandlerIO);
  108.   HandlerIO = NULL;
  109.  }
  110.  if(InputPort)
  111.  {
  112.   DeletePort(InputPort);
  113.   InputPort = NULL;
  114.  }
  115.  if(SigBit != -1)FreeSignal(SigBit);
  116. }
  117.  
  118. void * __asm __saveds input_handler(register __a0 struct InputEvent *ev,register __a1 APTR m_pool)
  119. {
  120.  struct InputEvent *t;
  121.  if((ev->ie_Class == IECLASS_RAWKEY)||((ev->ie_Class == IECLASS_RAWMOUSE)&&(ev->ie_Code != IECODE_NOBUTTON)))
  122.  {
  123.   if(t= AllocVec(sizeof(struct InputEvent),MEMF_PUBLIC | MEMF_CLEAR))
  124.   {
  125.    CopyMem(ev,t,sizeof(struct InputEvent));
  126.    t->ie_NextEvent = NULL;
  127.    if((ev->ie_Class == IECLASS_RAWMOUSE)&&(ev->ie_Code & Q_MASK_2))
  128.    {
  129.     t->ie_X = IntuitionBase->ActiveScreen->MouseX;
  130.     t->ie_Y = IntuitionBase->ActiveScreen->MouseY;
  131.    }
  132.    record->ie_NextEvent = t;
  133.    record = t;
  134.    if(break_on)
  135.    {
  136.     if(ev->ie_Code & IECODE_UP_PREFIX)
  137.     {
  138.      --numev;if(!numev) Signal(ourtask, 1L << SigBit);
  139.     }
  140.    }
  141.   }
  142.  }
  143.  return ((void *)ev);
  144. }
  145.  
  146. static void free_recordline()
  147. {
  148.  struct InputEvent *x;
  149.  struct InputEvent *t = record_anchor.ie_NextEvent;
  150.  while(t)
  151.  {
  152.   x = t->ie_NextEvent;
  153.   FreeVec(t);
  154.   t = x;
  155.  }
  156.  record_anchor.ie_NextEvent = NULL;
  157. }
  158.  
  159. void  write_file(UBYTE *name)
  160. {
  161.  FILE  *rec;
  162.  struct InputEvent *e;
  163.  struct InputEvent  e1;
  164.  struct InputEvent *le = NULL;
  165.  UBYTE buffer[STRMAXLEN];
  166.  char t[20];
  167.  ULONG min_delay;
  168.  ULONG i_mb,i_dl;
  169.  get(rec_min_delay,MUIA_String_Integer,&min_delay);
  170.  get(rec_include_mb,MUIA_Selected,&i_mb);
  171.  get(rec_include_delay,MUIA_Selected,&i_dl);
  172.  
  173.  if(rec=fopen(name,"w"))
  174.  {
  175.   e = record_anchor.ie_NextEvent;
  176.   while(e)
  177.   {
  178.    BOOL spc = FALSE;
  179.    long bytes;
  180.    UBYTE *dl = NULL;
  181.    *buffer = 0;
  182.    if((i_mb) &&(e->ie_Class == IECLASS_RAWMOUSE))
  183.    {
  184.     char ud = 'd';
  185.     if(le)
  186.     {
  187.      ULONG s = ((((e->ie_TimeStamp.tv_secs) - (le->ie_TimeStamp.tv_secs))-1) * 50) +
  188.                (((e->ie_TimeStamp.tv_micro) + (1000000 - le->ie_TimeStamp.tv_micro)) / 20000);
  189.      if((i_dl) && (s >= min_delay))fprintf(rec,"\\d%04ld",s);
  190.     }
  191.     le = e;
  192.     if(e->ie_Code & IECODE_UP_PREFIX)
  193.     {
  194.      ud = 'u';
  195.      e->ie_Code -= IECODE_UP_PREFIX;
  196.     }
  197.     switch(e->ie_Code)
  198.     {
  199.      case IECODE_LBUTTON : fprintf(rec,"\\(lm%c:%d,%d)",ud,e->ie_X,e->ie_Y);
  200.                            break;
  201.      case IECODE_RBUTTON : fprintf(rec,"\\(rm%c:%d,%d)",ud,e->ie_X,e->ie_Y);
  202.                            break;
  203.      case IECODE_MBUTTON : fprintf(rec,"\\(mm&c:%d,%d)",ud,e->ie_X,e->ie_Y);
  204.                            break;
  205.     }
  206.    }
  207.    else
  208.    {
  209.    BOOL hold = FALSE;
  210.    bytes = MapRawKey(e,buffer,STRMAXLEN,NULL);
  211.    CopyMem(e,&e1,sizeof(struct InputEvent));
  212.    if(e1.ie_Qualifier & IEQUALIFIER_RALT)e1.ie_Qualifier    -= IEQUALIFIER_RALT,hold = TRUE;
  213.    if(e1.ie_Qualifier & IEQUALIFIER_LALT)e1.ie_Qualifier    -= IEQUALIFIER_LALT,hold = TRUE;
  214.    if(e1.ie_Qualifier & IEQUALIFIER_CONTROL)e1.ie_Qualifier -= IEQUALIFIER_CONTROL,hold = TRUE;
  215.    if(hold)bytes = MapRawKey(&e1,buffer,STRMAXLEN,NULL);
  216.    if(bytes)
  217.    {
  218.     *(buffer + bytes) = 0;
  219.     if(bytes == 1)
  220.     {
  221.      {
  222.       *t = *buffer;*(t + 1) = 0;
  223.       *buffer = 0;
  224.       if(*t == 0x7f){spc = TRUE; strcpy(t,"del");dl = t;} 
  225.       if(*t < ' ')
  226.       {
  227.        spc = TRUE;
  228.        switch(*t)
  229.        {
  230.         case '\r' : strcpy(t,"return");
  231.                     break;
  232.         case '\n' : strcpy(t,"enter");
  233.                     break;
  234.         case '\t' : strcpy(t,"tab");
  235.                     break;
  236.         case 0x1b : strcpy(t,"esc");
  237.                     break;
  238.         case 0x08 : strcpy(t,"backspace");
  239.                     break;
  240.         default   : break;
  241.        }
  242.       }
  243.       if(make_control(e,buffer,dl)){ strcat(buffer,t); strcat(buffer,">");}
  244.       else 
  245.       {
  246.        if(spc){strcat(buffer,"<");strcat(buffer,t);strcat(buffer,">");}
  247.        else strcat(buffer,t);
  248.       }
  249.       if(le)
  250.       {
  251.        ULONG s = ((((e->ie_TimeStamp.tv_secs) - (le->ie_TimeStamp.tv_secs))-1) * 50) +
  252.                  (((e->ie_TimeStamp.tv_micro) + (1000000 - le->ie_TimeStamp.tv_micro)) / 20000);
  253.        if((i_dl) && (s >= min_delay))fprintf(rec,"\\d%04ld",s);
  254.       }
  255.       fputs(buffer,rec);
  256.       le = e;      
  257.      }
  258.     }
  259.     else
  260.     {
  261.      if(*buffer == 0x9b)
  262.      { 
  263.       spc = TRUE;
  264.       switch(*(buffer + 1))
  265.       {
  266.        case '0'     : strcpy(t,"F1"); break;
  267.        case '1'     : switch(*(buffer + 2))
  268.                       {
  269.                        case '0' : strcpy(t,"shift F1"); break;
  270.                        case '1' : strcpy(t,"shift F2"); break;
  271.                        case '2' : strcpy(t,"shift F3"); break;
  272.                        case '3' : strcpy(t,"shift F4"); break;
  273.                        case '4' : strcpy(t,"shift F5"); break;
  274.                        case '5' : strcpy(t,"shift F6"); break;
  275.                        case '6' : strcpy(t,"shift F7"); break;
  276.                        case '7' : strcpy(t,"shift F8"); break;
  277.                        case '8' : strcpy(t,"shift F9"); break;
  278.                        case '9' : strcpy(t,"shift F10"); break;
  279.                        case '~' : strcpy(t,"F2"); break;
  280.                       }
  281.                       break;
  282.        case '2'     : strcpy(t,"F3"); break;
  283.        case '3'     : strcpy(t,"F4"); break;
  284.        case '4'     : strcpy(t,"F5"); break;
  285.        case '5'     : strcpy(t,"F6"); break;
  286.        case '6'     : strcpy(t,"F7"); break;
  287.        case '7'     : strcpy(t,"F8"); break;
  288.        case '8'     : strcpy(t,"F9"); break;
  289.        case '9'     : strcpy(t,"F10"); break;
  290.        case '?'     : strcpy(t,"help"); break;
  291.        case 'A'     : strcpy(t,"up"); break;
  292.        case 'B'     : strcpy(t,"down"); break;
  293.        case 'D'     : strcpy(t,"left"); break;
  294.        case 'C'     : strcpy(t,"right"); break;
  295.        case 'T'     : strcpy(t,"shift up"); break;
  296.        case 'S'     : strcpy(t,"shift down"); break;
  297.        case ' '     : switch(*(buffer + 2))
  298.                       {
  299.                        case 'A' : strcpy(t,"shift left");  break;
  300.                        case '@' : strcpy(t,"shift right"); break;
  301.                       }
  302.                       break;
  303.       }
  304.      }
  305.      *buffer = 0;
  306.      if(make_control(e,buffer,t)){ strcat(buffer,t); strcat(buffer,">");}
  307.      else 
  308.      {
  309.       if(spc){strcat(buffer,"<");strcat(buffer,t);strcat(buffer,">");}
  310.       else strcat(buffer,t);
  311.      }
  312.      if(le)
  313.      {
  314.       ULONG s = ((((e->ie_TimeStamp.tv_secs) - (le->ie_TimeStamp.tv_secs))-1) * 50) +
  315.                 (((e->ie_TimeStamp.tv_micro) + (1000000 - le->ie_TimeStamp.tv_micro)) / 20000);
  316.        if((i_dl) && (s >= min_delay))fprintf(rec,"\\d%04ld",s);
  317.      }
  318.      fputs(buffer,rec);
  319.      le = e;
  320.     }
  321.    }
  322.    } /* RAWMOUSE */
  323.    e = e->ie_NextEvent;
  324.    if(e == record)break;
  325.   }
  326.   fclose(rec); 
  327.  }
  328. }
  329.  
  330. static ULONG make_control(struct InputEvent *ie,UBYTE *buffer,UBYTE *t)
  331. {
  332.  ULONG rc = FALSE;
  333.  if(ie->ie_Qualifier & Q_MASK)
  334.  {
  335.   rc = TRUE;
  336.   strcat(buffer,"<");
  337.   if(ie->ie_Qualifier & IEQUALIFIER_LEFTBUTTON)strcat(buffer,"leftbutton ");
  338.   if(ie->ie_Qualifier & IEQUALIFIER_RBUTTON)strcat(buffer,"rbutton ");
  339.   if(ie->ie_Qualifier & IEQUALIFIER_MIDBUTTON)strcat(buffer,"midbutton ");
  340.   if(ie->ie_Qualifier & IEQUALIFIER_CONTROL)strcat(buffer,"control ");
  341.   if(ie->ie_Qualifier & IEQUALIFIER_RALT)strcat(buffer,"ralt ");
  342.   if(ie->ie_Qualifier & IEQUALIFIER_LALT)strcat(buffer,"lalt ");
  343.   if(ie->ie_Qualifier & IEQUALIFIER_RCOMMAND)strcat(buffer,"rcommand ");
  344.   if(ie->ie_Qualifier & IEQUALIFIER_LCOMMAND)strcat(buffer,"lcommand ");
  345.   if(ie->ie_Qualifier & IEQUALIFIER_NUMERICPAD)strcat(buffer,"numericpad ");
  346.   if(!t)if(ie->ie_Qualifier & IEQUALIFIER_LSHIFT)strcat(buffer,"lshift ");
  347.   if(!t)if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)strcat(buffer,"rshift ");
  348.  }
  349.  return (rc);
  350. }
  351.  
  352.  
  353.